home *** CD-ROM | disk | FTP | other *** search
/ Mac Format 1994 October / Macformat17.cdr / Shareware City / Developers / shutdown-fx-20-c / sfx control app ƒ / Shell ƒ / environment.c < prev    next >
Text File  |  1994-07-11  |  5KB  |  144 lines

  1. /**********************************************************************\
  2.  
  3. File:        environment.c
  4.  
  5. Purpose:    This module handles initializing the environment and
  6.             checking for various environmental characteristics.
  7.  
  8. This program is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 2 of the License, or
  11. (at your option) any later version.
  12.  
  13. This program is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with this program in a file named "GNU General Public License".
  20. If not, write to the Free Software Foundation, 675 Mass Ave,
  21. Cambridge, MA 02139, USA.
  22.  
  23. \**********************************************************************/
  24.  
  25. #include "environment.h"
  26. #include "apple events.h"
  27. #include "error.h"
  28. #include "program globals.h"
  29. #include "GestaltEqu.h"
  30. #include "Traps.h"
  31.  
  32. Boolean            gHasColorQD;                /* color Quickdraw present? */
  33. Boolean            gHasAppleEvents;            /* apple events supported? */
  34. Boolean            gHasFSSpecs;                /* FSSpec calls supported? */
  35. Boolean            gStandardFile58;            /* standard file package supported? */
  36. Boolean            gHasPowerManager;            /* power manager present? (cf progress.c) */
  37. Boolean            gHasNotificationManager;    /* notification manager present? (cf error.c) */
  38. Boolean            gSystemSevenOrLater;        /* system 7 running? */
  39. Boolean            gWaitNextEventAvailable;    /* WaitNextEvent() implemented? */
  40. Boolean            gHasGestalt;                /* Gestalt() implemented? */
  41.  
  42. short            gForegroundWaitTime;        /* WaitNextEvent sleep time while in frgrnd */
  43. short            gBackgroundWaitTime;        /* WaitNextEvent sleep time while in bkgrnd */
  44. Boolean            gIsInBackground;            /* program is in background currently? */
  45. Boolean            gInProgress;                /* progress bar up? */
  46. Boolean            gDone;                        /* program done? */
  47. Boolean            gFrontWindowIsOurs;            /* frontmost window is one of ours? */
  48. short            gFrontWindowIndex;            /* gTheWindowData[] index of front window, if ours */
  49.  
  50. /* This is to stop the compiler from using Gestalt glue without killing
  51.    all the other pre-system 7 glue for other routines. */
  52. #pragma parameter __D0 RealGestalt(__D0,__A1)
  53. pascal OSErr RealGestalt(OSType selector,long *response) = {0xA1AD,0x2288};
  54. #define        Gestalt            RealGestalt
  55. #define        GESTALT_TRAP    0xA1AD            /* _Gestalt */
  56.  
  57. #define    GetTrapType(T)    (((T & 0x0800) > 0) ? ToolTrap : OSTrap)
  58. #define NumToolboxTraps()    ((NGetTrapAddress(_InitGraf, ToolTrap) ==    \
  59.                             NGetTrapAddress(0xAA6E, ToolTrap)) ? 0x0200    \
  60.                             : 0x0400)
  61.  
  62. Boolean TrapAvailable(short theTrap);
  63.  
  64. Boolean TrapAvailable(short theTrap)
  65. {
  66.     TrapType        tType;
  67.     
  68.     tType=GetTrapType(theTrap);
  69.     if (tType==ToolTrap)
  70.     {
  71.         theTrap=theTrap&0x07FF;
  72.         if (theTrap>=NumToolboxTraps())
  73.             theTrap=_Unimplemented;
  74.     }
  75.     return (NGetTrapAddress(theTrap, tType)!=NGetTrapAddress(_Unimplemented, ToolTrap));
  76. }
  77.  
  78. Boolean InitTheEnvironment(void)
  79. /* called very early -- this uses Gestalt to check out the computing environment;
  80.    see above for explanations of variables */
  81. {
  82.     long            gestalt_temp;
  83.     OSErr            isHuman;
  84.     SysEnvRec        theWorld;
  85.     
  86.     if (SysEnvirons(1, &theWorld)==envNotPresent)
  87.         return FALSE;
  88.     
  89.     gWaitNextEventAvailable=TrapAvailable(_WaitNextEvent);
  90.     gHasGestalt=TrapAvailable((short)GESTALT_TRAP);
  91.  
  92.     if (!gHasGestalt)
  93.         return FALSE;        /* requires Gestalt to function properly */
  94.  
  95.     if (gHasGestalt)
  96.     {
  97.         isHuman=Gestalt(gestaltSystemVersion, &gestalt_temp);
  98.         gSystemSevenOrLater=!(isHuman || (gestalt_temp < 1792));
  99.         
  100.         isHuman=Gestalt(gestaltQuickdrawVersion, &gestalt_temp);
  101.         gHasColorQD=!(isHuman || (gestalt_temp < gestalt8BitQD));
  102.     
  103.         isHuman=Gestalt(gestaltFSAttr, &gestalt_temp);
  104.         gHasFSSpecs=((isHuman==noErr) && (gestalt_temp&(1<<gestaltHasFSSpecCalls)));
  105.     
  106.         isHuman=Gestalt(gestaltStandardFileAttr, &gestalt_temp);
  107.         gStandardFile58=((isHuman==noErr) && (gestalt_temp&(1<<gestaltStandardFile58)));
  108.     
  109.         isHuman=Gestalt(gestaltPowerMgrAttr, &gestalt_temp);
  110.         gHasPowerManager=((!isHuman) && (gestalt_temp&(1<<gestaltPMgrCPUIdle)));
  111.         
  112.         isHuman=Gestalt(gestaltNotificationMgrAttr, &gestalt_temp);
  113.         gHasNotificationManager=(!((isHuman) ||
  114.             (((gestalt_temp >> gestaltNotificationPresent) & 0x01) != 1)));
  115.         
  116.         isHuman=Gestalt(gestaltAppleEventsAttr, &gestalt_temp);
  117.         gHasAppleEvents=((!isHuman) && (gestalt_temp&(1<<gestaltAppleEventsPresent)));
  118.     }
  119.     else
  120.     {
  121.         gHasColorQD=theWorld.hasColorQD;
  122.         gSystemSevenOrLater=(theWorld.systemVersion>=1792);
  123.         gHasFSSpecs=TrapAvailable(_HFSPinaforeDispatch);
  124.         gStandardFile58=gSystemSevenOrLater;
  125.         gHasPowerManager=TrapAvailable(0xA285);    /* _IdleUpdate */
  126.         gHasNotificationManager=TrapAvailable(_NMInstall);
  127.         gHasAppleEvents=TrapAvailable(_Pack8);
  128.     }
  129.     
  130.     if (gHasAppleEvents)
  131.         SetUpAppleEvents();        /* see apple events.c */
  132.     
  133.     gForegroundWaitTime=30;            /* WaitNextEvent sleep time when we're in frgrnd */
  134.     gBackgroundWaitTime=100;        /* WaitNextEvent sleep time when we're in bkgrnd */
  135.     gDone=FALSE;                    /* TRUE if program is done (exit event loop) */
  136.     gInProgress=FALSE;                /* TRUE if progress bar is up */
  137.     gIsInBackground=FALSE;            /* TRUE if program is in background */
  138.     gPendingResultCode=allsWell;    /* set to error code if error occurs while in bkgrnd */
  139.     gFrontWindowIsOurs=FALSE;
  140.     gFrontWindowIndex=0;
  141.     
  142.     return TRUE;
  143. }
  144.